package cc.rengu.oltp.service.realize;

import cc.rengu.oltp.service.common.entity.ChannelCallCfg;
import cc.rengu.oltp.service.common.enums.CheckResultEnum;
import cc.rengu.oltp.service.common.enums.TransStatusEnum;
import cc.rengu.oltp.service.model.OrderInfo;

import java.util.List;

/**
 * 交易客户化实现接口
 * Created by wangcheng on 2021/3/8 14:24
 */
public interface TransCustomImpl {
    /**
     * 通道调用场景识别
     *
     * @param request            交易请求对象
     * @param channelCallCfgList 多场景通道服务调用配置列表
     * @return 待调用通道配置信息
     */
    ChannelCallCfg channelCallSceneDiscern(Object request, List<ChannelCallCfg> channelCallCfgList) throws Exception;

    /**
     * 通道调用前业务检查
     *
     * @param request        交易请求对象
     * @param channelCallCfg 通道服务调用配置
     * @param orderInfo      订单信息
     * @return 业务检查结果
     */
    CheckResultEnum channelCallPreCheck(Object request, ChannelCallCfg channelCallCfg, OrderInfo orderInfo) throws Exception;

    /**
     * 通道服务调用结果处理
     *
     * @param request             交易请求对象
     * @param channelCallCfg      通道服务调用配置
     * @param transStatusEnum     通道调用返回的交易结果
     * @param channelResponse     通道调用返回的响应结果
     * @param needUpdateOrderInfo 需要更新的订单信息
     * @return 基于业务处理后的交易状态，若不需要根据业务更新业务状态，则原值返回请求参数中的交易状态
     */
    TransStatusEnum channelCallResultProc(Object request, ChannelCallCfg channelCallCfg, TransStatusEnum transStatusEnum, Object channelResponse, OrderInfo needUpdateOrderInfo) throws Exception;
}
